home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / amicron4 / part01
Encoding:
Internet Message Format  |  1991-03-14  |  46.6 KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i061: AmiCron 4.2 - cron task for the amiga, Part01/01
  4. Reply-To: ps106363@lehtori.tut.fi (Pasi Sainio)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i061@ab20.larc.nasa.gov>
  7. Date: 14 Mar 91 01:36:59 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga.misc
  11.  
  12. Submitted-by: ps106363@lehtori.tut.fi (Pasi Sainio)
  13. Posting-number: Volume 91, Issue 061
  14. Archive-name: utilities/amicron-4.2/part01
  15.  
  16. [ includes uuencoded executables  ...tad ]
  17.  
  18. There is now two version.  One that detaches
  19. itself from the running shell and the other one that doesn't.  So if
  20. you need the shell-window use AmiCronS and if you don't, use AmiCron.
  21. The other difference is the crontable IS NO LONGER DISK-RESIDENT!!.
  22. The program will read it to the ram and use that.  If you want to use
  23. an other crontable, just run the program with other filename.  It will
  24. send a messages to the one that is resident and it will read the new 
  25. table to the memory.
  26.  
  27. This is a (no longer) crude but effective version of the Unix (tm) 
  28. program known as "cron" modified to run on an Amiga.  For those 
  29. who aren't Unix knowledgeable, cron is a background task which 
  30. uses a disk-resident table to automatically run certain tasks on a 
  31. regular basis.
  32.  
  33.  
  34. #!/bin/sh
  35. # This is a shell archive.  Remove anything before this line, then unpack
  36. # it by saving it into a file and typing "sh file".  To overwrite existing
  37. # files, type "sh file -c".  You can also feed this as standard input via
  38. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  39. # will see the following message at the end:
  40. #        "End of archive 1 (of 1)."
  41. # Contents:  AmiCron.c AmiCron.doc AmiCron.uu AmiCronS.uu crontab inc.c
  42. #   makefile run.a self.a start.a
  43. # Wrapped by tadguy@ab20 on Wed Mar 13 20:36:57 1991
  44. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  45. if test -f 'AmiCron.c' -a "${1}" != "-c" ; then 
  46.   echo shar: Will not clobber existing file \"'AmiCron.c'\"
  47. else
  48. echo shar: Extracting \"'AmiCron.c'\" \(13838 characters\)
  49. sed "s/^X//" >'AmiCron.c' <<'END_OF_FILE'
  50. X/****************************************************************************
  51. X *                                                                          *
  52. X *                              A M I C R O N                               *
  53. X *                                                                          *
  54. X *                         Version 4.2 - 03-Jan-91                          *
  55. X *                                                                          *
  56. X *                              by P. Sainio                                *
  57. X *                                                                          *
  58. X ****************************************************************************
  59. X
  60. X    This is my version of AmiCron, I hope you like it... It's still
  61. Xin public domain so if you have any ideas let us know about them.
  62. X
  63. X *
  64. X *    amicron.c    (Version 2.5(a&L) by <CB>)
  65. X *
  66. X *    Public Domain (p) No Rights Reserved
  67. X *
  68. X *    This program operates as a daemon, waking up every minute
  69. X *    to execute the CRONTAB table.  
  70. X *
  71. X *    Put in startup-sequence like:
  72. X *        run newcli con:0/140/160/50/CronTask s:startcron
  73. X *    The startcron file needs to contains just one line:
  74. X *        amicron
  75. X *
  76. X *    Some notes are included below concerning the cron table
  77. X *    file format.  In this version the cron table file is left
  78. X *    on disk and not moved to core, and  the command character
  79. X *    to signify a newline '%' is not used.
  80. X *
  81. X *    Some cron table entry examples:
  82. X *
  83. X *    Print the date in the crontask window every minute:
  84. X *        * * * * * date
  85. X *
  86. X *    Print the date in the crontask window on the hour, every hour:
  87. X *        0 * * * * date
  88. X *
  89. X *    Run uupc at 4:30 am every day except Sat and Sun:
  90. X *        30 4 * * 1-5 uupc -siscuva
  91. X *
  92. X *    Backup the files every other day at 7:30 pm:
  93. X *        30 19 * * 1,3,5 sdbackup -s LAST dh0: incbkup_1:
  94. X *
  95. X */
  96. X
  97. X/* 
  98. X * Public Domain (p) by S. R. Sampson
  99. X * Version 2.3, October 1987
  100. X * Amiga port by Rick Schaeffer October 1987
  101. X *
  102. X * Rick Schaeffer          UUCP:  seismo!uunet!iscuva!ricks!ricks
  103. X * E. 13611 26th Ave.      Phone: (509)928-3533
  104. X * Spokane, WA  99216
  105. X *
  106. X * Modified path for CronTab & CronErr to suit Amiga enviroment better
  107. X * Version 2.31  <CB> 15.12.87 
  108. X *
  109. X * Fixed bug with CronTab entries specifying an event by date (month)
  110. X * i.e. "* * 24 12 * say Merry christmas", now works!
  111. X * Version 2.32 <CB> 25.12.87
  112. X *
  113. X * Removed "CronErr", an obvious Unix "feature"
  114. X * Version 2.33 <CB> 31.12.87 
  115. X *
  116. X * Additional support for Lattice 4.0, changed to complete sleep (no more  
  117. X * 5 I/O ints. per second), added command line parameter for CronTab path.
  118. X * Added feature to align Cron to start on 01 seconds, including "loss"
  119. X * due to lengthy command calls or extensive I/O.
  120. X * Version 2.4 <CB> 10.01.88 
  121. X *
  122. X * GRRRRRRR. Just when I thought it was safe to release that thing, C=A brings
  123. X * out AmyDos 1.3. So to have the output of programs called by Cron visible, I
  124. X * changed the "Run >nil:" parameter for execute() back to "Run ". This means,                         
  125. X * that you will have to look at the annoying CLI[#] messages, each time some 
  126. X * program is called. I was pleased with the way the old RUN >nil: worked, and
  127. X * will try to convince Andy Finkel to bring it back.
  128. X * In the meantime, this is:
  129. X * Version 2.5 <CB> 27.03.88
  130. X *
  131. X * Changed it to use ARP.  There is two versions, one that detaches itself from
  132. X * self and the other that doesn't
  133. X * Version 4.2 <PS> 03.01.91
  134. X
  135. X                        
  136. X______  /          
  137. X______\O                    - The Software Brewery - 
  138. X      \\                          
  139. X       o            Sparkling, fresh software from W.-Germany
  140. X                 
  141. X     @@@@@          Straight from the bar to your Amiga
  142. X     |~~~|\        
  143. X     | | |/        
  144. X     |___|        With our regards to the Software Distillery
  145. X
  146. XMembers are (listed alphabetically):
  147. XChristian Balzer alias <CB>, Lattice C, user interfaces, beer addict. 
  148. XChristof Bonnkirch, Aztec C, telecommunications, money adict.
  149. XHeiko Rath alias <HR>, Assembler, ROM-Kernal stuff, Marabou addict. 
  150. XPeter Stark alias PS, Lattice C, IO & utilities, WordStar addict.
  151. XRalf Woitinas alias RAF, Assembler, anything, Ray-Tracing addict.
  152. XTorsten Wronski alias MM, Assembler, anything, girls addict.
  153. X
  154. XBeverages: Altenmuenster Brauer Bier, Urfraenkisches Landbier, Grohe Bock.
  155. X
  156. XSend exotic drinks, comments, critizism, flames to:
  157. X
  158. XThe Software Brewery
  159. XChristian Balzer
  160. XIm Wingertsberg 45
  161. XD-6108 Weiterstadt
  162. XWest-Germany
  163. X
  164. XOur BBS "AmigaNode" isn't online yet. As soon as it becomes available, 
  165. Xyou'll be the first to know :-).
  166. X
  167. X *
  168. X * Compilation notes:
  169. X * Program is compiled with Lattice C 5.05 and the makefile is included.
  170. X * I have removed some of the comments, sorry about that.  If you're
  171. X * intrested see the original source.
  172. X *
  173. X * NOTE!!!  There is no errorchecking for crontab-file...
  174. X */
  175. X
  176. X#define MAXLINE    132
  177. X#define SIZE    64
  178. X#define ABSEXECBASE ((struct ExecBase **)4L)
  179. X#define NOCRON "Can't get crontab-file"
  180. X#define CRONPORT "AmiCronV4.2"
  181. X#define NO_MESS_MEM "No memory for message!"
  182. X#define NO_REPLY "Could not create replyport!"
  183. X#define ERR_IN_FILE "Error reading crontab-file!"
  184. X#define NO_DEVICE "Could not open timer.device!"
  185. X#define NO_TIMER_PORT "Could not open timerport!"
  186. X#define NO_CRON_PORT "Could not create CronPort!"
  187. X#define EXITING "Quiting the AmiCron!"
  188. X
  189. Xstruct cronmsg {
  190. X    struct Message cm_Msg;
  191. X    char *newfile;
  192. X};
  193. X
  194. Xstruct iobuf {
  195. X    unsigned char *base;
  196. X    unsigned char *ptr;
  197. X    int rcnt;
  198. X    int size;
  199. X};
  200. X
  201. Xtypedef char boolean;
  202. X
  203. Xextern struct ArpBase *ArpBase;
  204. Xextern struct DOSBase *DOSBase;
  205. Xextern struct IntuitionBase *IntuitionBase;
  206. X
  207. Xstruct MsgPort *timerport,*cronport,*mycron=NULL,*replyport;
  208. Xstruct iobuf fd;
  209. Xstruct cronmsg *newcron;
  210. X
  211. Xstruct NewShell nsh;
  212. Xstruct timerequest tr;
  213. X
  214. Xchar min[SIZE],hour[SIZE],day[SIZE],month[SIZE],wday[SIZE],command[SIZE],eof,
  215. X        *tokv[]={min,hour,day,month,wday},
  216. X        *com="CronFile",*args,*help="Usage: AmiCron [CronFile]",
  217. X        cronfile[256]="S:CronTab";
  218. X
  219. Xstruct TextAttr myfont = {
  220. X    "topaz.font",
  221. X    TOPAZ_EIGHTY,0,0 };
  222. X
  223. Xstruct IntuiText body1={
  224. X    0,1,JAM1,10,5,&myfont,NULL,NULL },body2={
  225. X    0,1,JAM1,10,14,&myfont,NULL,NULL },no1={
  226. X    0,1,JAM1,6,3,&myfont,"Cancel",NULL },no2={
  227. X    0,1,JAM1,6,3,&myfont,"Quit",NULL };
  228. X
  229. Xstatic void cleanup(void),alarm(int),wakeup(void),MyExit(void);
  230. Xstatic ULONG systime(void);
  231. Xstatic boolean getline(void),getfile(void),
  232. X                    match(register char *,register int);
  233. Xstatic char *scanner(register char *,register char *),
  234. X                *fgets(char *,int);
  235. X
  236. Xvoid __asm __saveds AmiCron(register __a0 char *cmd,register __d0 long len) {
  237. X
  238. X    ULONG current,signals,getsigs,timesig,messig;
  239. X    long count;
  240. X    register struct tm *tm;
  241. X
  242. X    count=GADS(cmd,len,help,&args,com);
  243. X    if (count<0) {
  244. X        body1.IText=args;
  245. X        AutoRequest(NULL,&body1,NULL,&no1,0,0,188,50);
  246. X        cleanup();
  247. X    }
  248. X
  249. X    if (count)
  250. X        strcpy(cronfile,args);
  251. X
  252. X    Forbid();
  253. X
  254. X    if (mycron=FindPort(CRONPORT)) {
  255. X        Permit();
  256. X        if (replyport=CreatePort(0,0)) {
  257. X            if (newcron=AllocMem(sizeof(struct cronmsg),
  258. X                                        MEMF_PUBLIC|MEMF_CLEAR)) {
  259. X                newcron->cm_Msg.mn_Node.ln_Type=NT_MESSAGE;
  260. X                newcron->cm_Msg.mn_ReplyPort=replyport;
  261. X                newcron->newfile=cronfile;
  262. X                PutMsg(mycron,newcron);
  263. X                WaitPort(replyport);
  264. X                FreeMem(newcron,sizeof(struct cronmsg));
  265. X            }
  266. X            else {
  267. X                body1.IText=NO_MESS_MEM;
  268. X                AutoRequest(NULL,&body1,NULL,&no1,0,0,sizeof(NO_MESS_MEM)*8+44,50);
  269. X            }
  270. X            DeletePort(replyport);
  271. X        }
  272. X        else {
  273. X            body1.IText=NO_REPLY;
  274. X            AutoRequest(NULL,&body1,NULL,&no1,0,0,sizeof(NO_REPLY)*8+44,50);
  275. X        }
  276. X        cleanup();
  277. X    }
  278. X
  279. X    else {
  280. X        if (!(cronport=CreatePort(CRONPORT,0))) {
  281. X            body1.IText=NO_CRON_PORT;
  282. X            AutoRequest(NULL,&body1,NULL,&no1,0,0,sizeof(NO_CRON_PORT)*8+44,50);
  283. X            cleanup();
  284. X        }
  285. X    }
  286. X    Permit();
  287. X
  288. X    if (timerport=CreatePort(0,0)) {
  289. X        tr.tr_node.io_Message.mn_Node.ln_Type=NT_MESSAGE;
  290. X        tr.tr_node.io_Message.mn_Length=sizeof(struct timerequest);
  291. X        tr.tr_node.io_Message.mn_ReplyPort=timerport;
  292. X
  293. X        if (!OpenDevice(TIMERNAME,UNIT_VBLANK,&tr,0)) {
  294. X            if (getfile()) {
  295. X                signals=SIGBREAKF_CTRL_C|(timesig = 1<<timerport->mp_SigBit)|
  296. X                            (messig = 1<<cronport->mp_SigBit);
  297. X                for (;;) {
  298. X                    wakeup();
  299. X                    current=systime();
  300. X                    tm=localtime(¤t);
  301. X                    alarm(60-tm->tm_sec);
  302. X                    do {
  303. X                        getsigs=Wait(signals);
  304. X                        if (getsigs & SIGBREAKF_CTRL_C)
  305. X                            cleanup();
  306. X                        if (getsigs & messig) {
  307. X                            if (newcron=(struct cronmsg *)GetMsg(cronport)) {
  308. X                                strcpy(cronfile,newcron->newfile);
  309. X                                ReplyMsg(newcron);
  310. X                                DosFreeMem(fd.base);
  311. X                                fd.base=NULL;
  312. X                                if (!getfile())
  313. X                                    cleanup();
  314. X                            }
  315. X                        }
  316. X                    }
  317. X                    while (!(getsigs & timesig));
  318. X                }
  319. X            }
  320. X        }
  321. X    }
  322. X    cleanup();
  323. X}
  324. X
  325. Xstatic void wakeup() {
  326. X
  327. X    register struct tm *tm;
  328. X    long cur_time;
  329. X     
  330. X    cur_time=systime();        /* get the current time */
  331. X    tm = localtime(&cur_time);    /* break it down */
  332. X    /* Now let's see if there is a CronTab file out there <CB> */     
  333. X
  334. X    eof = FALSE;
  335. X    while (!eof)  {
  336. X        if (getline() && match(min,tm->tm_min) &&
  337. X           match(hour,tm->tm_hour) && match(day,tm->tm_mday) &&
  338. X           match(month,tm->tm_mon+1) && match(wday,tm->tm_wday))  {
  339. X        /* Weird localtime months ^ range from 0-11 !!! <CB>*/
  340. X            nsh.nsh_Pri=(*ABSEXECBASE)->ThisTask->tc_Node.ln_Pri;
  341. X            nsh.nsh_Control=BACKGROUND_SHELL;
  342. X            nsh.nsh_Input=Input();
  343. X            nsh.nsh_Output=Output();
  344. X            ASyncRun(command,NULL,(struct ProcessControlBlock *)&nsh);
  345. X        }
  346. X    }
  347. X}
  348. X/*
  349. X *    A line consists of six fields.  The first five are:
  350. X *
  351. X *        minute:         0-59
  352. X *        hour:           0-23
  353. X *        day:            1-31
  354. X *        month:          1-12
  355. X *        weekday:        0-6 (Sunday = 0)
  356. X *
  357. X *    The fields are seperated by spaces or tabs, with the
  358. X *    first field left justified (no leading spaces or tabs).
  359. X *    See below for optional field syntax.
  360. X *
  361. X *    The last field is the command field.  This command will
  362. X *    be executed by the CLI just as if typed from a console.
  363. X */
  364. X
  365. Xstatic boolean getline() {
  366. X    register char *p;
  367. X    register int   i;
  368. X    char buffer[MAXLINE];
  369. X    if (fgets(buffer,sizeof buffer) == NULL)  {
  370. X        eof = TRUE;
  371. X        return(FALSE);
  372. X    }
  373. X    for (p = buffer, i = 0; i < 5; i++)  {
  374. X        if ((p = scanner(tokv[i], p)) == (char *)NULL)
  375. X            return(FALSE);
  376. X    }
  377. X    strcpy(command, p);     /* scoop the command */
  378. X    return(TRUE);
  379. X}
  380. Xstatic char *scanner(register char *token,register char *offset) {
  381. X    /*    *token    target buffer to receive scanned token */
  382. X    /*    *offset    place holder into source buffer */
  383. X    while ((*offset != ' ') && (*offset != '\t') && *offset)
  384. X        *token++ = *offset++;
  385. X    /*
  386. X     *      Check for possible error condition
  387. X     */
  388. X         
  389. X    if (!*offset)
  390. X        return ((char *)NULL);
  391. X    *token = '\0';
  392. X        
  393. X    while ((*offset == ' ') || (*offset == '\t'))
  394. X        offset++;
  395. X    return (offset);
  396. X}
  397. X/*
  398. X *    This routine will match the left string with the right number.
  399. X *
  400. X *    The string can contain the following syntax:
  401. X *
  402. X *    *        This will return TRUE for any number
  403. X *    x,y [,z, ...]    This will return TRUE for any number given.
  404. X *    x-y        This will return TRUE for any number within
  405. X *            the range of x thru y.
  406. X */
  407. Xstatic boolean match(register char *left,register int right) {
  408. X
  409. X    register int    n;
  410. X    register char    c;
  411. X    n = 0;
  412. X
  413. X    if (!strcmp(left, "*"))
  414. X        return(TRUE);
  415. X    while ((c = *left++) && (c >= '0') && (c <= '9'))
  416. X        n  =  (n * 10) + c - '0';
  417. X    switch (c)  {
  418. X        case '\0':
  419. X            return ((boolean)(right == n));
  420. X        case ',':
  421. X            if ((boolean)(right == n))
  422. X                return(TRUE);
  423. X            do {
  424. X                n = 0;
  425. X                while ((c = *left++) && (c >= '0') && (c <= '9'))
  426. X                    n = (n * 10) + c - '0';
  427. X                 if (right == n)
  428. X                    return(TRUE);
  429. X            } while (c == ',');
  430. X            return(FALSE);
  431. X        case '-':
  432. X            if (right < n)
  433. X                return(FALSE);
  434. X            n = 0;
  435. X            while ((c = *left++) && (c >= '0') && (c <= '9'))
  436. X                n = (n * 10) + c - '0';
  437. X            return((boolean)(right <= n));
  438. X    }
  439. X}
  440. X
  441. Xstatic boolean getfile(void) {
  442. X
  443. X    BPTR lock,file;
  444. X    struct FileInfoBlock *fib;
  445. X    boolean succ=FALSE;
  446. X
  447. X    if (lock=Lock(cronfile,ACCESS_READ)) {
  448. X        if (fib=AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC)) {
  449. X            if (Examine(lock,fib)) {
  450. X                if (fd.base=DosAllocMem(fib->fib_Size)) {
  451. X                    if (file=Open(cronfile,MODE_OLDFILE)) {
  452. X                        fd.size=Read(file,fd.base,fib->fib_Size);
  453. X                        if (fd.size=fib->fib_Size)
  454. X                            fd.ptr=fd.base;
  455. X                            succ=TRUE;
  456. X                        Close(file);
  457. X                    }
  458. X                }
  459. X            }
  460. X            FreeMem(fib,sizeof(struct FileInfoBlock));
  461. X        }
  462. X        UnLock(lock);
  463. X    }
  464. X    if (!succ) {
  465. X
  466. X        long length;
  467. X
  468. X        body1.IText=NOCRON;
  469. X        body1.NextText=&body2;
  470. X        body2.IText=cronfile;
  471. X        length=strlen(cronfile);
  472. X
  473. X        AutoRequest(NULL,&body1,NULL,&no1,0,0,((length>sizeof(NOCRON))?
  474. X                        length : sizeof(NOCRON))*8+44,59);
  475. X    }
  476. X    return succ;
  477. X}
  478. X
  479. Xstatic char *fgets(char *buffer,int len) {
  480. X
  481. X    unsigned char ch;
  482. X    int count=0;
  483. X
  484. X    while (len>count) {
  485. X        if (fd.rcnt<fd.size) {
  486. X            if ((ch=*fd.ptr++)=='\n') {
  487. X                buffer[count++]='\0';
  488. X                fd.rcnt++;
  489. X                return buffer;
  490. X            }
  491. X            buffer[count++]=ch;
  492. X            fd.rcnt++;
  493. X        }
  494. X        else {
  495. X            fd.rcnt=0;
  496. X            fd.ptr=fd.base;
  497. X            if (count==0)
  498. X                return NULL;
  499. X            else {
  500. X                buffer[count]='\0';
  501. X                return buffer;
  502. X            }
  503. X        }
  504. X    }
  505. X}
  506. X
  507. Xstatic ULONG systime() {
  508. X    tr.tr_node.io_Command=TR_GETSYSTIME;
  509. X    DoIO(&tr);
  510. X    return (tr.tr_time.tv_secs+(((8*365+2)*24+6)*60*60));
  511. X    /* To Greenwich Mean Time  ^^^^^^^^^^^^^^^^^^^^^ */
  512. X}
  513. X
  514. Xstatic void alarm(int secs) {
  515. X    tr.tr_node.io_Command=TR_ADDREQUEST;
  516. X    tr.tr_time.tv_secs=secs;
  517. X    tr.tr_time.tv_micro=0;
  518. X    SendIO(&tr);
  519. X}
  520. X
  521. Xstatic void cleanup() {
  522. X    if (cronport) {
  523. X        Forbid();
  524. X        while (newcron=(struct cronmsg *)GetMsg(cronport))
  525. X            ReplyMsg(newcron);
  526. X        DeletePort(cronport);
  527. X        Permit();
  528. X        if (fd.base)
  529. X            DosFreeMem(fd.base);
  530. X        if (timerport) {
  531. X            if (tr.tr_node.io_Device) {
  532. X                if (tr.tr_node.io_Command)
  533. X                    AbortIO(&tr);
  534. X                CloseDevice(&tr);
  535. X            }
  536. X            else {
  537. X                body1.IText=NO_DEVICE;
  538. X                AutoRequest(NULL,&body1,NULL,&no1,0,0,sizeof(NO_DEVICE)*8+44,50);
  539. X            }
  540. X            DeletePort(timerport);
  541. X        }
  542. X        else {
  543. X            body1.IText=NO_TIMER_PORT;
  544. X            AutoRequest(NULL,&body1,NULL,&no1,0,0,sizeof(NO_TIMER_PORT)*8+44,50);
  545. X        }
  546. X        body1.IText=EXITING;
  547. X        body1.NextText=NULL;
  548. X        AutoRequest(NULL,&body1,NULL,&no2,0,0,sizeof(EXITING)*8+44,50);
  549. X    }
  550. X    MyExit();
  551. X}
  552. END_OF_FILE
  553. if test 13838 -ne `wc -c <'AmiCron.c'`; then
  554.     echo shar: \"'AmiCron.c'\" unpacked with wrong size!
  555. fi
  556. # end of 'AmiCron.c'
  557. fi
  558. if test -f 'AmiCron.doc' -a "${1}" != "-c" ; then 
  559.   echo shar: Will not clobber existing file \"'AmiCron.doc'\"
  560. else
  561. echo shar: Extracting \"'AmiCron.doc'\" \(9059 characters\)
  562. sed "s/^X//" >'AmiCron.doc' <<'END_OF_FILE'
  563. X                    AmiCron - Cron task for the Amiga
  564. X
  565. XFollowing below is the original AmiCron documentation by Rick
  566. XSchaeffer (Version 2.3) and Christian Balzer (Version 2.5).
  567. XI haven't changed it so I list here the changes.
  568. X<PS>
  569. X
  570. XThe difference is that there is now two version.  One that detaches
  571. Xitself from the running shell and the other one that doesn't.  So if
  572. Xyou need the shell-window use AmiCronS and if you don't, use AmiCron.
  573. XThe other difference is the crontable IS NO LONGER DISK-RESIDENT!!.
  574. XThe program will read it to the ram and use that.  If you want to use
  575. Xan other crontable, just run the program with other filename.  It will
  576. Xsend a messages to the one that is resident and it will read the new 
  577. Xtable to the memory.
  578. X<PS>
  579. X
  580. X---snip------snap------snip------snap------snip------snap------snip---
  581. X
  582. XFollowing below is the original AmiCron documentation by Rick
  583. XSchaeffer (Version 2.3). I changed it were necessary and listed
  584. Xadditional features below.
  585. X<CB>
  586. X
  587. XThis is a (no longer) crude but effective version of the Unix (tm) 
  588. Xprogram known as "cron" modified to run on an Amiga.  For those 
  589. Xwho aren't Unix knowledgeable, cron is a background task which 
  590. Xuses a disk-resident table to automatically run certain tasks on a 
  591. Xregular basis.  The cron table's format is very simple...it 
  592. Xcontains entries in the form of lines where each line has 6 fields 
  593. Xand each field is separated by "white space" (either tabs or 
  594. Xspaces) from it's neighbor. The fields are as follows:
  595. X
  596. X   1.  Minute       (0-59)
  597. X   2.  Hour         (0-23)
  598. X   3.  Day          (1-31)    (now works, <CB>)
  599. X   4.  Month        (1-12) 
  600. X   5.  Day of week  (0-6 where 0=Sunday and 6=Saturday)
  601. X   6.  Command      This is the command to be run at the appointed 
  602. X                    time.  It will be run just as if typed into 
  603. X                    the CLI.
  604. X
  605. XEach of the first 5 fields are numbers.  However, it is 
  606. Xpermissable to use an asterisk (*) in a field to mean ALL possible 
  607. Xnumbers for that field,  and you can specify a series of numbers 
  608. Xseparated by commas (,) and ranges separated by dashes (-).  For 
  609. Xinstance, in the Day field you could specify "1,5,10" to mean the 
  610. Xfirst, fifth, and tenth days of the month; or you could specify 
  611. X"1-15" to mean the first through the fifteenth of the month.  Here 
  612. Xare some examples of Amicron table entries:
  613. X
  614. X      Print the date in the crontask window every minute:
  615. X          * * * * * date
  616. X  
  617. X      Print the date in the crontask window on the hour, every hour:
  618. X          0 * * * * date
  619. X  
  620. X      Run uupc at 4:30 am every day except Sat and Sun:
  621. X          30 4 * * 1-5 uupc -siscuva
  622. X  
  623. X      Incrementally backup the files every other day at 7:30 pm:
  624. X          30 19 * * 1,3,5 sdbackup -l -s LAST dh0: incbkup_1:
  625. X
  626. X        Backup the files on the 1st and 15th of each month at 1:00 am:
  627. X            00 01 1,15 * * sdbackup -l dh0: SemiBkup_1:
  628. X
  629. XThe Amicron table file is by default located using the following path:
  630. X
  631. X    S:    (or S:CronTab to be exact and include the filename)
  632. X
  633. Xbut you now may specify a complete path (including filename!) for
  634. Xthe CronTab file (which needn't but should have this name) as a
  635. Xcommand line parameter like this:
  636. X
  637. X    Amicron RAM:MyCronTab
  638. X
  639. Xwhich would cause Amicron to use the CronTab file "MyCronTab"
  640. Xlocated in the RAM: disk and not to access a disk drive every minute
  641. Xto read in the CronTab file.
  642. X
  643. XCrontab entries *MUST* be left justified starting in column 1 and 
  644. Xeach entry must contain 6 fields, each separated by spaces or 
  645. Xtabs.
  646. X
  647. XTo run Amicron, you must use your favorite editor to create the
  648. X"CronTab" file.  Amicron needs a CLI window for displaying the 
  649. Xoutput of the commands it runs...but it can be made as small or 
  650. Xlarge as you wish.  Assuming that you have placed Amicron in your 
  651. Xcommand directory (c:), you can start it by typing the following 
  652. Xline into a "newcli" window:
  653. X    Amicron
  654. XThen you can size and move the window anywhere you want, just be 
  655. Xsure not to type anything else into the window because that would 
  656. Xprevent cron tasks from running (read: printing something in that 
  657. Xwindow).
  658. X
  659. XI have an entry in my startup-sequence file that looks like this:
  660. X   run newcli con:0/140/160/50/CronTask s:startcron
  661. XThe "s:startcron" file contains one line:
  662. X   Amicron
  663. XThis automatically sets up a tiny CronTask window and runs Amicron 
  664. Xin it.
  665. X
  666. XThis program was originally written by Steve R.  Sampson (UUCP:
  667. Xsys1!killer!sampson), who very kindly responded to my request for
  668. Xa PD cron that I could port to Minix.  I haven't done that yet
  669. X(My new Amiga 2000 came in right after I received the cron
  670. Xprogram <grin>) but will do so ASAP.  The modifications to make
  671. Xit run on the Amiga were very minor!
  672. X
  673. XRick Schaeffer          UUCP:  seismo!uunet!iscuva!ricks
  674. XE. 13611 26th Ave.      Phone: (509)928-3533
  675. XSpokane, WA  99216
  676. X
  677. X---- Changes up to Version 2.4
  678. XV2.31& V2.32
  679. XBesides changing the paths for CronTab (s:) & CronErr (t:) to more
  680. Xdecent Amiga places, I encountered a bug when I wanted to start
  681. Xcron a special program on xmas. After some investigation I found
  682. Xout that the localtime() function returns months only in the range
  683. Xfrom  0 to 11. So it was not surprising  that my "12" in the month
  684. Xfield of CronTab was completely ignored. 
  685. XTo not have the user adapt to the computer by having him to supply
  686. Xmonths in the range from 0 to 11, I now increase the localtime()
  687. Xmonth by one, so the documentation above is correct again. 
  688. X
  689. XV2.33
  690. XThen I started wondering what that CronErr file was doing in the
  691. Xfirst place, since all errors where displayed in the CLI window.
  692. XThat instantly lead to the removal of this Unix artefact.
  693. XI'm aware of the need for a stderr output, nevertheless Cron should
  694. Xalways be attached to a CLI, so we can get rid of CronErr. 
  695. X
  696. XV2.4 (a = Aztec C V3.6 , L = Lattice C V4.0)
  697. XI experienced a loss of aprox. one second per minute in the AmiCron
  698. Xwakeups, since it was send to sleep for a fixed amount of time (59
  699. Xseconds). The time Cron did spent in "bed" increased with the
  700. Xlength of the command call and the workload of the machine
  701. X(especially I/O ints. like disk access). 
  702. XSo I now align to the to the next minute and keep this alignment by
  703. Xtranquilizing the task only for the remaining time 'till the next
  704. Xminute. Although the goal of starting it on the minute may only work
  705. Xif there is no heavy workload on your machine, this delay is at least
  706. Xnot cumulative, like the one in the original version.
  707. XAnother odd thing is that the Delay() function (nasty AmigaDog) 
  708. Xobviously creates 5 I/O ints. per second (measured with SysMon
  709. Xby Perry S. Kivolovitz). 
  710. XAlthough I couldn't detect any performance decreases caused by these
  711. Xinterrupts, I decided to use the TimeDelay function from the Timer.c
  712. XRKM example by Rob Peck in version 2.4 of AmiCron. Besides creating
  713. Xno I/O ints., I found that the TimeDelay() function is not effected
  714. Xby other I/O ints., so it turned out to be MUCH more accurate than
  715. Xthe Delay() function and therefore worth compiling & linking that
  716. Xtimer.c part.  
  717. XI also included the path command line parameter, a check for the 
  718. Xexistance of the CronTab file and tighten up the code here and there.
  719. X
  720. XV2.5
  721. XJust in time for KS & WB 1.3 I changed my "run >nil:" call in AmiCron
  722. Xback to a plain "run", since the 1.3 RUN kills ALL output, not just
  723. Xthe naughty "[CLIn]" message from RUN. Hope you have a good time
  724. Xwatching thoose CLI messages in your Cron window :-}.
  725. X
  726. XSome hints for the serious AmiCron addict: 
  727. XIf don't wanna AmiCron to stumble  through your default path and
  728. Xblast you with requesters (i.e you sometimes remove a disk with
  729. Xutilities on which you have a path assigned to), why not define
  730. Xyour own path in the StartCron batch file? Quite simple, but very
  731. Xeffective.
  732. XAmiCron can be easyly terminated (during it's next wakeup) by typing
  733. XCtrl-C in its window or by sending it a break using the BREAK
  734. Xcommand.  
  735. X
  736. XThis project/enhancement/fix is a combined effort by:
  737. X                          
  738. X______  /          
  739. X______\O                    - The Software Brewery - 
  740. X      \\                          
  741. X       o            Sparkling, fresh software from W.-Germany
  742. X                 
  743. X     @@@@@          Straight from the bar to your Amiga
  744. X     |~~~|\        
  745. X     | | |/        
  746. X     |___|        With our regards to the Software Distillery
  747. X---------------------------------------------------------------------
  748. X
  749. Xa West-German group of (hopefully professional) Amiga programmers
  750. Xinspired by the Software Destillery 
  751. X(but we germans are more into brewing & drinking beer <grin>).
  752. X
  753. XProgramming & documentation by <CB>
  754. X
  755. X<CB> is : Christian Balzer 
  756. X          Im Wingertsberg 45
  757. X          D-6108 Weiterstadt
  758. X          W. Germany
  759. X
  760. XAztec C support by Christof Bonnkirch (another CB :-) )
  761. XFurther support/ideas by Peter Stark, Heiko Rath and Ralf Woitinas.
  762. X
  763. XI would like to thank Steve R. Sampson for his initial PD cron, Rick
  764. XSchaeffer for his port to the Amiga, Rob Peck for all the work he
  765. Xdid and will (hopefully) do in the future and especially Fred Fish
  766. Xfor his continuous effort to spread all that fantastic PD software 
  767. Xall over the world, without all of them I wouldn't have done this.   
  768. X<CB>
  769. END_OF_FILE
  770. if test 9059 -ne `wc -c <'AmiCron.doc'`; then
  771.     echo shar: \"'AmiCron.doc'\" unpacked with wrong size!
  772. fi
  773. # end of 'AmiCron.doc'
  774. fi
  775. if test -f 'AmiCron.uu' -a "${1}" != "-c" ; then 
  776.   echo shar: Will not clobber existing file \"'AmiCron.uu'\"
  777. else
  778. echo shar: Extracting \"'AmiCron.uu'\" \(6921 characters\)
  779. sed "s/^X//" >'AmiCron.uu' <<'END_OF_FILE'
  780. Xbegin 666 AmiCron
  781. XM```#\P`````````%``````````0```!H````4P```EL```#P````_````^D`O
  782. XM``!H8`I*_```!]``````2?D`````2H!G%B/`````0$/Y````1&`"$MA1R/_\[
  783. XM8!(S^0``$`````!$<`$CP````$!'^0```;QR`"`\````C6`")L%1R/_\+'@`?
  784. XM!$/Y```!4W`G3J[]V"E```AG``"R($`I:``X`!`@*``P*4``#"9N`10B*P"8Z
  785. XM+$!.KO^@*4``!$7Y```!)"5\```'T```%6L`"0`$%7P``@`%(CP```%.)#P`!
  786. XM``/M+&P`#$ZN_^(E0``.)4``"D?Z_S8E4P`6*5,``"QX``12+@$GD\E!^@!JD
  787. XM+&P`"$ZN_=Y#^@`V2H!K$$*3,T``!$'Z`(=.KO\<8!I!^@!?3J[_'"(L``1.?
  788. XMKO^F(DXL>``$3J[^8BQX``1.=0```48`````````````````````````````Y
  789. XM``````````````````!!;6E#<F]N`$Y)3#H`87)P+FQI8G)A<GD`0V]U;&0@#
  790. XM;F]T(&-R96%T92`E<RUP<F]C97-S(0H`)7,@<W1A<G1E9"!A="!B86-K9W)O1
  791. XM=6YD('-H96QL("5D"@````/L````!`````````$>````J@```)````!:````8
  792. XM!`````$````R````'@```#H````8`````@````0```!`````#@````````/RP
  793. XM```#Z0```%-)^0````!!^0```$0@.0```$!.N@$P+&P`""(L``1.KO^F+'@`(
  794. XM!%(N`2<B+```+&P`#$ZN_V0L;``(3J[^ADYU````````````````````````@
  795. XM`````````````````````````````````````````````````````````````
  796. XM`````````````````````````````````````````````````````````````
  797. XM`````````````````````````````````````````````````````````````
  798. XM`````````````````````````````````````````````````````````````
  799. XM`````````````````````````````````````````````````````````````
  800. XM``````````````````````!.^0````!P80```^P````"`````0````X````(@
  801. XM`````0````(```%&`````0````0````"`````````_(```/I```"6TY5_^1(=
  802. XMYR\Z2?D`````)D@N`$CG`#`@2R`'(FP`,$7L`ZPF;``L+&P`"$ZN_P1,WPP`1
  803. XM*T#_Z&PN*6P#K`%(2'@`,DAX`+QP`"\`+P!(;`%D<@`O`4AL`3PO`4ZZ"/AAZ
  804. XM``?63^\`($JM_^AG#"!L`ZQ#[``T$MAF_"QX``1.KO]\0_H"A$ZN_GHI0``4)
  805. XM9P``V$ZN_W:1R'``+&P`"$ZN_LXI0`'$9P``CG`8(CP``0`!+'@`!$ZN_SHIR
  806. XM0`'82H!G.B!`$7P`!0`((&P!V"%L`<0`#D'L`#0B;`'8(T@`%"!L`!1.KOZ2V
  807. XM(&P!Q$ZN_H`B;`'8<!A.KO\N8"Q!^@(6*4@!2$AX`#)(>`#D<``O`"\`2&P!5
  808. XM9'(`+P%(;`$\+P%.N@@T3^\`(")L`<0L;``(3J[^R&`L0?H!]"E(`4A(>``RF
  809. XM2'@!#'``+P`O`$AL`61R`"\!2&P!/"\!3KH'^D_O`"!A``;48$9!^@&><``LU
  810. XM;``(3J[^SBE``<!*@&8P0?H!R"E(`4A(>``R2'@!!'(`+P$O`4AL`61T`"\"+
  811. XM2&P!/"\"3KH'LF$`!I!/[P`@+'@`!$ZN_W:1R'``+&P`"$ZN_LXI0`&\9P``/
  812. XM]AE\``4""CE\`"@"%"E``A!!^@&(<`%#[`("<@`L>``$3J[^1$J`9@``S&$`G
  813. XM!'!*`&<``,)P`"!L`;P0*``/<@$D`>&B*`(@!`!`$`!T`"!L`<`4*``/Y:&`R
  814. XM@2P`*T'_[&$``:YA``6^*T#__$AM__Q.N@<L)$!P/)"2+H!A``7(6$\@!BQX(
  815. XM``1.KO["*@`(!0`,9P1A``78(`7`K?_L9TH@;`'`+'@`!$ZN_HPI0`'82H!G(
  816. XM-B)`(&D`%$WL`#0<V&;\(FP!V"QX``1.KOZ&(FP!R"QL``A.KOZD0JP!R&$`T
  817. XM`[Q*`&8$80`%AB`%P(1GDF``_VYA``5X3-]<]$Y=3G5#<F]N1FEL90``57-A0
  818. XM9V4Z($%M:4-R;VX@6T-R;VY&:6QE70!T;W!A>BYF;VYT``!#86YC96P``%%U8
  819. XM:70``$%M:4-R;VY6-"XR`$YO(&UE;6]R>2!F;W(@;65S<V%G92$``$-O=6QDJ
  820. XM(&YO="!C<F5A=&4@<F5P;'EP;W)T(0!#;W5L9"!N;W0@8W)E871E($-R;VY0U
  821. XM;W)T(0``=&EM97(N9&5V:6-E```J`$-A;B=T(&=E="!C<F]N=&%B+69I;&4`"
  822. XM`$-O=6QD(&YO="!O<&5N('1I;65R+F1E=FEC92$``$-O=6QD(&YO="!O<&5NT
  823. XM('1I;65R<&]R="$`475I=&EN9R!T:&4@06UI0W)O;B$``$Y5__A(YP`R80`$S
  824. XM"BM`__A(;?_X3KH%>%A/)D!"+`.J2BP#JF8``*AA``"L2@!G\"\K``1(;`(JB
  825. XM80`!2E!/2@!GWB\K``A(;`)J80`!.%!/2@!GS"\K``Q(;`*J80`!)E!/2@!GP
  826. XMNB`K`!!2@"\`2&P"ZF$``1!03TH`9Z0O*P`82&P#*F$``/Y03TH`9Y(P?``$@
  827. XM(E`@:0$4&6@`"0'@&7P`@@'A+&P`#$ZN_\HI0`'F3J[_Q"E``>I![`-JD\E%[
  828. XM[`'<+&P`"$ZN_=Y@`/]43-],`$Y=3G5.5?]T2.<!$$AX`(1(;?]T80`"O%!/8
  829. XM2H!F"AE\``$#JG``8#I'[?]T?@!P!;Z`;"(@!^6`+PM![``8+S`(`&$``"90V
  830. XM3R9`(`MF!'``8!!2AV#8($M#[`-J$MAF_'`!3-\(@$Y=3G5(YP`P)F\`#"1OS
  831. XM`!`0$G(@L`%G$'()L`%G"DH`9P86P%**8.A*$F8$<`!@%D(3$!)R(+`!9P9R_
  832. XM";`!9@12BF#N(`I,WPP`3G5(YP<0)F\`%"XO`!A\`"!+0_K^`A`8L!EF#$H`G
  833. XM9O9F!G`!8```WAH;(`5*`&<B<#"Z`&4<<#FZ`&(6(`9R"DZZ`\1R`!(%T($L1
  834. XM`'(PG(%@UG``$`5*0&<.!$``+&<64T!G8F```)Z^AE?`1`!(@$C`8```D+Z&C
  835. XM5\!$`$B`2,!*`&<$<`%@?'P`&AL@!4H`9R)P,+H`91QP.;H`8A8@!G(*3KH#Y
  836. XM8G(`$@70@2P`<C"<@6#6OH9F!'`!8$AP++H`9\9P`&`^OH9L!'``8#9\`!H;@
  837. XM(`5*`&<B<#"Z`&4<<#FZ`&(6(`9R"DZZ`QQR`!(%T($L`'(PG(%@UKZ&7\!$9
  838. XM`$B`2,!,WPC@3G5(YS\2>@!![``T(@AT_BQL``Q.KO^L+@!*AV<``)@@/```"
  839. XM`01R`2QX``1.KO\Z)D`@"V=V(@<D"RQL``Q.KO^:2H!G5B`K`'PL;``(3J[^\
  840. XMJBE``<AG1$'L`#0B""0\```#[2QL``Q.KO_B+`!*AF<J(@8D+`'()BL`?$ZNZ
  841. XM_]8I0`'4(BL`?"E!`=1G!BEL`<@!S'H!(@9.KO_<(DL@/````00L>``$3J[_>
  842. XM+B('+&P`#$ZN_Z9*!6980?K\5"E(`4A![`%0*4@!3$'L`#0I2`%<(DA*&6;\(
  843. XM4XF3R"@)<!>X@&,$(@1@`B(`YX%P+-*`2'@`.R\!<``O`"\`2&P!9'0`+P)(-
  844. XM;`$\+P).N@'F3^\`("`%3-](_$YU2.<'$"9O`!0N+P`8>@"^A6]8("P!T+"L?
  845. XM`=1L-"!L`<P<&"E(`<QR"KP!9A0@15*%<@`@"!>!"`!2K`'0(`M@*B!%4H4@)
  846. XM"!>&"`!2K`'08+YP`"E``=`I;`'(`<Q*A68$<`!@!D(S6``@"TS?".!.=2\.)
  847. XM.7P`"@(>0^P"`BQX``1.KOXX(#P/#)-@T*P"(BQ?3G5(YP$"+B\`##E\``D"?
  848. XM'BE'`B)"K`(F0^P"`BQX``1.KOXR3-]`@$YU+PY*K`'`9P`!#BQX``1.KO]\&
  849. XM(&P!P"QX``1.KOZ,*4`!V$J`9P@B0$ZN_H9@Y")L`<`L;``(3J[^R"QX``1.#
  850. XMKO]V2JP!R&<,(FP!R"QL``A.KOZD2JP!O&=@2JP"%F<@2FP"'F<,0^P"`BQX9
  851. XM``1.KOX@0^P"`BQX``1.KOX^8"Q!^OK2*4@!2$AX`#)(>`$4<``O`"\`2&P!(
  852. XM9'(`+P%(;`$\+P%.N@!X3^\`(")L`;PL;``(3J[^R&`L0?KZMBE(`4A(>``R5
  853. XM2'@`_'``+P`O`$AL`61R`"\!2&P!/"\!3KH`/D_O`"!!^OJD*4@!2)'(*4@!H
  854. XM3$AX`#)(>`#4<``O`"\`2&P!>"\(2&P!/"\(3KH`#D_O`"!.N@`,+%].=4[Y)
  855. XM```"($[Y````%D[Y```!/$[Y```!!````^P````!`````0``"5P````#````H
  856. XM`P``"6(```EH```)5@````$````$````"@````````/R```#Z0```/!.5?_XX
  857. XM+PLF;`.P(`MF!$?Z`'P94P/$&6L``0/%&6L``@/&0BP#QT'L`\0I2`.\0>L`H
  858. XM`TAM__@O"$ZZ`'Y03U:`U\`@+?_X(CP```X03KH`[BE``[A*$V<>&5,#R!EKO
  859. XM``$#R1EK``(#RG``&4`#RW(!*4$#M&`(0BP#R$*L`[1![`/(*4@#P"9?3EU.[
  860. XM=4-35#8`````````````````````````````````````````````````````5
  861. XM(&\`!")(<@!P`"\"#!``*V<&#!``+68"4D@0&`0``#!M$@P```EN#"0!Y8'26
  862. XM@M*!TH!@Y@P1`"UF`D2!)!\@"%.`(&\`"""!D(E.=4Y5__PO"R9O`!!.NO[PI
  863. XM(!.0K`.X*T#__$JL`[1G"`:M```.$/_\2&W__$ZZ`2PF;?_X3EU.=0``2.<PT
  864. XM`"0`)@%(0DA#Q,'&P,#!U$-(0D)"T(),WP`,3G5*@&H``!Y$@$J!:@``#$2!Y
  865. XM80``($2!3G5A```81(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(!
  866. XM0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&9+
  867. XM44,,00@`9```!NF964,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FB
  868. XMJDA#@,$V`#`"-`-(0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,%!)A\D'TYU0
  869. XM2.<P,BQL`!`@;P`8(F\`'"1O`"`F;P`D("\`*"(O`"PD+P`P)B\`-$ZN_J1,C
  870. XMWTP,3G4``````````'!A3E7_Z$CG#Q`F;P`T(!,B/``!48!.NO[J*T#_\"P`%
  871. XM(!,B/``!48!.NO[8+@$@!R(\```.$$ZZ_LHH`"`'(CP```X03KK^O"X!(`=RX
  872. XM/$ZZ_K(K0/_H(`=R/$ZZ_J8N`2E'`\PI;?_H`]`I1`/42&W_\&$``$PJ`"`%I
  873. XM!(````=L*4`#X"EM__`#Z"Z%2&W_\&$``(8I0`/<("W_\%*`*4`#V"`&6(!R[
  874. XM!TZZ_E@I00/D0>P#S"`(3.T(\/_43EU.=4CG`Q`F;P`0+CP```>R+!,,A@``G
  875. XM`6UO'B`'<@1.NOXD2H%F"`2&```!;F`&!(8```%M4H=@V@R&```!;680(`=RT
  876. XM!$ZZ_?Y*@6<$4H=\`":&(`=,WPC`3G5(YP<0)F\`%"XO`!@@!W($3KK]V$J!$
  877. XM9@9P'2E``9!Z`"P3<`RZ@&P<(`7E@$'L`8PB,`@`LH9N#$'L`8R<L`@`4H5@_
  878. XMWB:&(`5,WPC@3G4```/R```#Z@```&\`````````````````````````````6
  879. XM``````(J```":@```JH```+J```#*@```L@```+24SI#<F]N5&%B````````Q
  880. XM`````````````````````````````````````````````````````````````
  881. XM`````````````````````````````````````````````````````````````
  882. XM`````````````````````````````````````````````````````````````
  883. XM`````````````````````````````````````````````````````````````
  884. XM`````````````````````````````````````````````````````````````
  885. XM`````````````````````````NP`"`````$````*``4```$T````````````[
  886. XM`0````H`#@```30````````````!````!@`#```!-````O@```````$````&.
  887. XM``,```$T```#```````````?````'````!\````>````'P```!X````?````/
  888. XM'P```!X````?````'@```!\```/L````!0````(```&$```!<````30````PJ
  889. XM````+`````D````$````*````"0````@````'````!@```&````!;````5@`@
  890. X+``%$`````````_($^
  891. X``
  892. Xend
  893. Xsize 4916
  894. END_OF_FILE
  895. if test 6921 -ne `wc -c <'AmiCron.uu'`; then
  896.     echo shar: \"'AmiCron.uu'\" unpacked with wrong size!
  897. fi
  898. # end of 'AmiCron.uu'
  899. fi
  900. if test -f 'AmiCronS.uu' -a "${1}" != "-c" ; then 
  901.   echo shar: Will not clobber existing file \"'AmiCronS.uu'\"
  902. else
  903. echo shar: Extracting \"'AmiCronS.uu'\" \(6568 characters\)
  904. sed "s/^X//" >'AmiCronS.uu' <<'END_OF_FILE'
  905. Xbegin 666 AmiCronS
  906. XM```#\P`````````#``````````(````5```#1P```/H```/I````%4CG@(!)-
  907. XM^0`````L>``$0_D````^<"=.KOW8*4```"!`*6@`,``$*6@`.``(3-\!`4ZZ7
  908. XM`!HL;```3J[^ADYU87)P+FQI8G)A<GD```!.^0````!P80```^P````!````C
  909. XM`````!`````!`````0```$X````!`````@````8````````#\@```^D```-'4
  910. XM3E7_Y$CG+SI)^0`````F2"X`2.<`,"!+(`<B;``H1>P#I"9L`"0L;```3J[_$
  911. XM!$S?#``K0/_H;"XI;`.D`4!(>``R2'@`O'``+P`O`$AL`5QR`"\!2&P!-"\!L
  912. XM3KH+(&$`!]9/[P`@2JW_Z&<,(&P#I$/L`"P2V&;\+'@`!$ZN_WQ#^@*$3J[^6
  913. XM>BE```QG``#83J[_=I'(<``L;```3J[^SBE``;QG``".<!@B/``!``$L>``$S
  914. XM3J[_.BE``=!*@&<Z($`1?``%``@@;`'0(6P!O``.0>P`+")L`=`C2``4(&P`,
  915. XM#$ZN_I(@;`&\3J[^@")L`=!P&$ZN_RY@+$'Z`A8I2`%`2'@`,DAX`.1P`"\`Q
  916. XM+P!(;`%<<@`O`4AL`30O`4ZZ"EQ/[P`@(FP!O"QL``!.KO[(8"Q!^@'T*4@!:
  917. XM0$AX`#)(>`$,<``O`"\`2&P!7'(`+P%(;`$T+P%.N@HB3^\`(&$`!M1@1D'Z'
  918. XM`9YP`"QL``!.KO[.*4`!N$J`9C!!^@'(*4@!0$AX`#)(>`$$<@`O`2\!2&P!E
  919. XM7'0`+P)(;`$T+P).N@G:80`&D$_O`"`L>``$3J[_=I'(<``L;```3J[^SBE`&
  920. XM`;1G``#V&7P`!0(".7P`*`(,*4`""$'Z`8AP`4/L`?IR`"QX``1.KOY$2H!FU
  921. XM``#,80`$<$H`9P``PG``(&P!M!`H``]R`20!X:(H`B`$`$`0`'0`(&P!N!0HZ
  922. XM``_EH8"!+``K0?_L80`!KF$`!;XK0/_\2&W__$ZZ""8D0'`\D)(N@&$`!<A8_
  923. XM3R`&+'@`!$ZN_L(J``@%``QG!&$`!=@@!<"M_^QG2B!L`;@L>``$3J[^C"E`/
  924. XM`=!*@&<V(D`@:0`43>P`+!S89OPB;`'0+'@`!$ZN_H8B;`'`+&P``$ZN_J1"`
  925. XMK`'`80`#O$H`9@1A``6&(`7`A&>28`#_;F$`!7A,WUST3EU.=4-R;VY&:6QEU
  926. XM``!5<V%G93H@06UI0W)O;B!;0W)O;D9I;&5=`'1O<&%Z+F9O;G0``$-A;F-E/
  927. XM;```475I=```06UI0W)O;E8T+C(`3F\@;65M;W)Y(&9O<B!M97-S86=E(0``E
  928. XM0V]U;&0@;F]T(&-R96%T92!R97!L>7!O<G0A`$-O=6QD(&YO="!C<F5A=&4@*
  929. XM0W)O;E!O<G0A``!T:6UE<BYD979I8V4``"H`0V%N)W0@9V5T(&-R;VYT86(M$
  930. XM9FEL90``0V]U;&0@;F]T(&]P96X@=&EM97(N9&5V:6-E(0``0V]U;&0@;F]T"
  931. XM(&]P96X@=&EM97)P;W)T(0!1=6ET:6YG('1H92!!;6E#<F]N(0``3E7_^$CGN
  932. XM`#)A``0**T#_^$AM__A.N@9R6$\F0$(L`Z)*+`.B9@``J&$``*Q*`&?P+RL``
  933. XM!$AL`B)A``%*4$]*`&?>+RL`"$AL`F)A``$X4$]*`&?,+RL`#$AL`J)A``$FL
  934. XM4$]*`&>Z("L`$%*`+P!(;`+B80`!$%!/2@!GI"\K`!A(;`,B80``_E!/2@!G>
  935. XMDC!\``0B4"!I`109:``)`=@9?`""`=DL;``$3J[_RBE``=Y.KO_$*4`!XD'L'
  936. XM`V*3R47L`=0L;```3J[]WF``_U1,WTP`3EU.=4Y5_W1(YP$02'@`A$AM_W1AQ
  937. XM``*\4$]*@&8*&7P``0.B<`!@.D?M_W1^`'`%OH!L(B`'Y8`O"T'L`!`O,`@`L
  938. XM80``)E!/)D`@"V8$<`!@$%*'8-@@2T/L`V(2V&;\<`%,WPB`3EU.=4CG`#`FT
  939. XM;P`,)&\`$!`2<B"P`6<0<@FP`6<*2@!G!A;`4HI@Z$H29@1P`&`60A,0$G(@]
  940. XML`%G!G()L`%F!%**8.X@"DS?#`!.=4CG!Q`F;P`4+B\`&'P`($M#^OX"$!BPB
  941. XM&68,2@!F]F8&<`%@``#>&AL@!4H`9R)P,+H`91QP.;H`8A8@!G(*3KH$_'(`+
  942. XM$@70@2P`<C"<@6#6<``0!4I`9PX$0``L9Q930&=B8```GKZ&5\!$`$B`2,!@C
  943. XM``"0OH97P$0`2(!(P$H`9P1P`6!\?``:&R`%2@!G(G`PN@!E''`YN@!B%B`&&
  944. XM<@I.N@2:<@`2!="!+`!R,)R!8-:^AF8$<`%@2'`LN@!GQG``8#Z^AFP$<`!@Y
  945. XM-GP`&AL@!4H`9R)P,+H`91QP.;H`8A8@!G(*3KH$5'(`$@70@2P`<C"<@6#62
  946. XMOH9?P$0`2(!(P$S?".!.=4CG/Q)Z`$'L`"PB"'3^+&P`!$ZN_ZPN`$J'9P``E
  947. XMF"`\```!!'(!+'@`!$ZN_SHF0"`+9W8B!R0++&P`!$ZN_YI*@&=6("L`?"QLF
  948. XM``!.KOZJ*4`!P&=$0>P`+"(()#P```/M+&P`!$ZN_^(L`$J&9RHB!B0L`<`FQ
  949. XM*P!\3J[_UBE``<PB*P!\*4$!S&<&*6P!P`'$>@$B!DZN_]PB2R`\```!!"QXB
  950. XM``1.KO\N(@<L;``$3J[_IDH%9EA!^OQ4*4@!0$'L`4@I2`%$0>P`+"E(`50B*
  951. XM2$H99OQ3B9/(*`EP%[B`8P0B!&`"(@#G@7`LTH!(>``[+P%P`"\`+P!(;`%<E
  952. XM=``O`DAL`30O`DZZ!`Y/[P`@(`5,WTC\3G5(YP<0)F\`%"XO`!AZ`+Z%;U@@6
  953. XM+`'(L*P!S&PT(&P!Q!P8*4@!Q'(*O`%F%"!%4H5R`"`(%X$(`%*L`<@@"V`J>
  954. XM($52A2`(%X8(`%*L`<A@OG``*4`!R"EL`<`!Q$J%9@1P`&`&0C-8`"`+3-\(E
  955. XMX$YU+PXY?``*`A9#[`'Z+'@`!$ZN_C@@/`\,DV#0K`(:+%].=4CG`0(N+P`,F
  956. XM.7P`"0(6*4<"&D*L`AY#[`'Z+'@`!$ZN_C),WT"`3G4O#DJL`;AG``$.+'@`B
  957. XM!$ZN_WP@;`&X+'@`!$ZN_HPI0`'02H!G"")`3J[^AF#D(FP!N"QL``!.KO[(H
  958. XM+'@`!$ZN_W9*K`'`9PPB;`'`+&P``$ZN_J1*K`&T9V!*K`(.9R!*;`(69PQ#+
  959. XM[`'Z+'@`!$ZN_B!#[`'Z+'@`!$ZN_CY@+$'Z^M(I2`%`2'@`,DAX`11P`"\`>
  960. XM+P!(;`%<<@`O`4AL`30O`4ZZ`J!/[P`@(FP!M"QL``!.KO[(8"Q!^OJV*4@!)
  961. XM0$AX`#)(>`#\<``O`"\`2&P!7'(`+P%(;`$T+P%.N@)F3^\`($'Z^J0I2`%`A
  962. XMD<@I2`%$2'@`,DAX`-1P`"\`+P!(;`%P+PA(;`$T+PA.N@(V3^\`($ZZ``8LW
  963. XM7TYU3OD````T<&%.5?_X+PLF;`.H(`MF!$?Z`'P94P.\&6L``0.]&6L``@.^(
  964. XM0BP#OT'L`[PI2`.T0>L``TAM__@O"$ZZ`'Y03U:`U\`@+?_X(CP```X03KH`P
  965. XM[BE``[!*$V<>&5,#P!EK``$#P1EK``(#PG``&4`#PW(!*4$#K&`(0BP#P$*L1
  966. XM`ZQ![`/`*4@#N"9?3EU.=4-35#8`````````````````````````````````>
  967. XM````````````````````(&\`!")(<@!P`"\"#!``*V<&#!``+68"4D@0&`0`[
  968. XM`#!M$@P```EN#"0!Y8'2@M*!TH!@Y@P1`"UF`D2!)!\@"%.`(&\`"""!D(E.<
  969. XM=4Y5__PO"R9O`!!.NO[P(!.0K`.P*T#__$JL`ZQG"`:M```.$/_\2&W__$ZZ(
  970. XM`2PF;?_X3EU.=0``2.<P`"0`)@%(0DA#Q,'&P,#!U$-(0D)"T(),WP`,3G5*K
  971. XM@&H``!Y$@$J!:@``#$2!80``($2!3G5A```81(!$@4YU2H%J```,1(%A```&-
  972. XM1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(0C(")!].S
  973. XM=2\#=A`,00"`9```!N&944,,00@`9```!NF964,,02``9```!N6954-*06L`R
  974. XM``;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(0<3!D()D```(4T/0@63^<@`R<
  975. XM`TA#Y[A(0,%!)A\D'TYU2.<P,BQL``@@;P`8(F\`'"1O`"`F;P`D("\`*"(O[
  976. XM`"PD+P`P)B\`-$ZN_J1,WTP,3G4``````````'!A3E7_Z$CG#Q`F;P`T(!,BC
  977. XM/``!48!.NO[J*T#_\"P`(!,B/``!48!.NO[8+@$@!R(\```.$$ZZ_LHH`"`'V
  978. XM(CP```X03KK^O"X!(`=R/$ZZ_K(K0/_H(`=R/$ZZ_J8N`2E'`\0I;?_H`\@ID
  979. XM1`/,2&W_\&$``$PJ`"`%!(````=L*4`#V"EM__`#X"Z%2&W_\&$``(8I0`/44
  980. XM("W_\%*`*4`#T"`&6(!R!TZZ_E@I00/<0>P#Q"`(3.T(\/_43EU.=4CG`Q`F>
  981. XM;P`0+CP```>R+!,,A@```6UO'B`'<@1.NOXD2H%F"`2&```!;F`&!(8```%M%
  982. XM4H=@V@R&```!;680(`=R!$ZZ_?Y*@6<$4H=\`":&(`=,WPC`3G5(YP<0)F\`8
  983. XM%"XO`!@@!W($3KK]V$J!9@9P'2E``8AZ`"P3<`RZ@&P<(`7E@$'L`80B,`@`&
  984. XMLH9N#$'L`82<L`@`4H5@WB:&(`5,WPC@3G4```/L`````0````````E6````#
  985. XM`0````(````*`````````_(```/J````^@````````````````````````(B-
  986. XM```"8@```J(```+B```#(@```L@```+24SI#<F]N5&%B````````````````E
  987. XM`````````````````````````````````````````````````````````````
  988. XM`````````````````````````````````````````````````````````````
  989. XM`````````````````````````````````````````````````````````````
  990. XM`````````````````````````````````````````````````````````````
  991. XM`````````````````````````````````````````````````````````````
  992. XM`````````````````NP`"`````$````*``4```$L`````````````0````H`^
  993. XM#@```2P````````````!````!@`#```!+````O@```````$````&``,```$LC
  994. XM```#```````````?````'````!\````>````'P```!X````?````'P```!X`4
  995. XM```?````'@```!\`````````````````````````````````````````````<
  996. XM`````````````````````````````````````````````````````````````
  997. XM`````````````````````````````````````````````````````````````
  998. XM`````````````````````````````````````````````````````````````
  999. XM`````````````````````````````````````````````````````````````
  1000. XM`````````````````````````````````````````````````````````````
  1001. XM`````````````````````````````````````````````````````````````
  1002. XM`````````````````````````````````````````````````````````````
  1003. XM`````````````````````````````````````````````````````````````
  1004. XM`````````````````````````````````````````````````````````````
  1005. XM`````````````````````````````````````````````````````````````
  1006. XM`````````````````````````````````````````````````````````````
  1007. XM``````````````````````````````````````````````````/L````!0``T
  1008. XM``$```%\```!:````2P````H````)`````D````"````(````!P````8````_
  1009. X=%````!````%X```!9````5````$\`````````_("'
  1010. X``
  1011. Xend
  1012. Xsize 4664
  1013. END_OF_FILE
  1014. if test 6568 -ne `wc -c <'AmiCronS.uu'`; then
  1015.     echo shar: \"'AmiCronS.uu'\" unpacked with wrong size!
  1016. fi
  1017. # end of 'AmiCronS.uu'
  1018. fi
  1019. if test -f 'crontab' -a "${1}" != "-c" ; then 
  1020.   echo shar: Will not clobber existing file \"'crontab'\"
  1021. else
  1022. echo shar: Extracting \"'crontab'\" \(15 characters\)
  1023. sed "s/^X//" >'crontab' <<'END_OF_FILE'
  1024. X* * * * * beep
  1025. END_OF_FILE
  1026. if test 15 -ne `wc -c <'crontab'`; then
  1027.     echo shar: \"'crontab'\" unpacked with wrong size!
  1028. fi
  1029. # end of 'crontab'
  1030. fi
  1031. if test -f 'inc.c' -a "${1}" != "-c" ; then 
  1032.   echo shar: Will not clobber existing file \"'inc.c'\"
  1033. else
  1034. echo shar: Extracting \"'inc.c'\" \(277 characters\)
  1035. sed "s/^X//" >'inc.c' <<'END_OF_FILE'
  1036. X#include <proto/exec.h>
  1037. X#include <proto/arp.h>
  1038. X#include <proto/dos.h>
  1039. X#include <proto/intuition.h>
  1040. X
  1041. X#include <exec/execbase.h>
  1042. X#include <exec/memory.h>
  1043. X#include <devices/timer.h>
  1044. X#include <libraries/arpbase.h>
  1045. X#include <graphics/text.h>
  1046. X
  1047. X#include <time.h>
  1048. X#include <string.h>
  1049. X
  1050. END_OF_FILE
  1051. if test 277 -ne `wc -c <'inc.c'`; then
  1052.     echo shar: \"'inc.c'\" unpacked with wrong size!
  1053. fi
  1054. # end of 'inc.c'
  1055. fi
  1056. if test -f 'makefile' -a "${1}" != "-c" ; then 
  1057.   echo shar: Will not clobber existing file \"'makefile'\"
  1058. else
  1059. echo shar: Extracting \"'makefile'\" \(479 characters\)
  1060. sed "s/^X//" >'makefile' <<'END_OF_FILE'
  1061. XAmiCron.lzh : AmiCronS AmiCron
  1062. X    lharc f AmiCron.lzh *
  1063. X
  1064. XAmiCronS : AmiCron.o self.o
  1065. X    blink self.o+AmiCron.o to AmiCronS lib lib:lc.lib sd sc
  1066. X
  1067. XAmiCron : AmiCron.o start.o run.o
  1068. X    blink start.o+run.o+AmiCron.o to AmiCron lib lib:lc.lib sd
  1069. X
  1070. XAmiCron.o : AmiCron.c inc.p
  1071. X    lc -Hinc.p -v -cusfq AmiCron
  1072. X
  1073. Xinc.p : inc.c
  1074. X    lc -ph -v -cusfq -oinc.p inc.c
  1075. X
  1076. Xstart.o : start.a
  1077. X    lc:asm -u -iinclude: start.a
  1078. X
  1079. Xrun.o : run.a
  1080. X    lc:asm -u -iinclude: run.a
  1081. X
  1082. Xself.o : self.a
  1083. X    lc:asm -u -iinclude: self.a
  1084. END_OF_FILE
  1085. if test 479 -ne `wc -c <'makefile'`; then
  1086.     echo shar: \"'makefile'\" unpacked with wrong size!
  1087. fi
  1088. # end of 'makefile'
  1089. fi
  1090. if test -f 'run.a' -a "${1}" != "-c" ; then 
  1091.   echo shar: Will not clobber existing file \"'run.a'\"
  1092. else
  1093. echo shar: Extracting \"'run.a'\" \(559 characters\)
  1094. sed "s/^X//" >'run.a' <<'END_OF_FILE'
  1095. X    INCLUDE    "macros.i"
  1096. X    INCLUDE    "exec/types.i"
  1097. X    INCLUDE    "libraries/arpbase.i"
  1098. X    INCLUDE    "exec/ables.i"
  1099. X
  1100. XExecBase    EQU    4
  1101. X
  1102. X    csect    _NOMERGE,0,0,0,4
  1103. X;    section    _NOMERGE,code
  1104. X
  1105. X    XDEF    MyExit,cmdlen,cmdline,run
  1106. X    XREF    LinkerDB,AmiCron,curdir,ArpBase,DOSBase,seglist
  1107. X
  1108. Xrun    lea    LinkerDB,a4
  1109. X    lea    cmdline,a0
  1110. X    move.l    cmdlen,d0
  1111. X    jsr    AmiCron(pc)
  1112. XMyExit    move.l    ArpBase(a4),a6
  1113. X    move.l    curdir(a4),d1
  1114. X    Call    UnLock
  1115. X
  1116. X    move.l    ExecBase.w,a6
  1117. X    FORBID
  1118. X    move.l    seglist(a4),d1
  1119. X    move.l    DOSBase(a4),a6
  1120. X    Call    UnLoadSeg
  1121. X    move.l    ArpBase(a4),a6
  1122. X    Call    ArpExit
  1123. X    rts
  1124. X
  1125. Xcmdlen    dc.l    0
  1126. Xcmdline    ds.b    256
  1127. X    END
  1128. END_OF_FILE
  1129. if test 559 -ne `wc -c <'run.a'`; then
  1130.     echo shar: \"'run.a'\" unpacked with wrong size!
  1131. fi
  1132. # end of 'run.a'
  1133. fi
  1134. if test -f 'self.a' -a "${1}" != "-c" ; then 
  1135.   echo shar: Will not clobber existing file \"'self.a'\"
  1136. else
  1137. echo shar: Extracting \"'self.a'\" \(784 characters\)
  1138. sed "s/^X//" >'self.a' <<'END_OF_FILE'
  1139. X    INCLUDE    "macros.i"
  1140. X    INCLUDE    "exec/types.i"
  1141. X    INCLUDE    "exec/ables.i"
  1142. X    INCLUDE    "exec/execbase.i"
  1143. X    INCLUDE    "libraries/dosextens.i"
  1144. X    INCLUDE    "libraries/arpbase.i"
  1145. X
  1146. X    BITDEF    PR,DEFSTACK,7
  1147. XExecBase    EQU    4
  1148. X
  1149. X    xref    LinkerDB
  1150. X    xref    AmiCron
  1151. X
  1152. X    csect    _NOMERGE,0,0,0,4
  1153. X;    section    _NOMERGE,code
  1154. X
  1155. X    XDEF    MyExit
  1156. X
  1157. Xrun    movem.l    d0/a0,-(a7)
  1158. X    lea    LinkerDB,a4
  1159. Xcont    move.l    ExecBase.w,a6
  1160. X    lea    Arp,a1
  1161. X    moveq.l    #ArpVersion,d0
  1162. X    Call    OpenLibrary
  1163. X    move.l    d0,ArpBase(a4)
  1164. X    move.l    d0,a0
  1165. X    move.l    ab_DosBase(a0),DOSBase(a4)
  1166. X    move.l    ab_IntuiBase(a0),IntuitionBase(a4)
  1167. X
  1168. X    movem.l    (a7)+,d0/a0
  1169. X    jsr    AmiCron(pc)
  1170. XMyExit    move.l    ArpBase(a4),a6
  1171. X    Call    ArpExit
  1172. X    rts
  1173. X
  1174. XArp    dc.b    "arp.library",0
  1175. X
  1176. X    csect    __MERGED,1,0,0,4
  1177. X;    section    __MERGED,data
  1178. X
  1179. X    xdef    ArpBase,DOSBase,IntuitionBase
  1180. X
  1181. XArpBase    dc.l    0
  1182. XDOSBase    dc.l    0
  1183. XIntuitionBase
  1184. X    dc.l    0
  1185. X    END
  1186. END_OF_FILE
  1187. if test 784 -ne `wc -c <'self.a'`; then
  1188.     echo shar: \"'self.a'\" unpacked with wrong size!
  1189. fi
  1190. # end of 'self.a'
  1191. fi
  1192. if test -f 'start.a' -a "${1}" != "-c" ; then 
  1193.   echo shar: Will not clobber existing file \"'start.a'\"
  1194. else
  1195. echo shar: Extracting \"'start.a'\" \(2032 characters\)
  1196. sed "s/^X//" >'start.a' <<'END_OF_FILE'
  1197. X    INCLUDE    "macros.i"
  1198. X    INCLUDE    "exec/types.i"
  1199. X    INCLUDE    "exec/ables.i"
  1200. X    INCLUDE    "exec/execbase.i"
  1201. X    INCLUDE    "libraries/dosextens.i"
  1202. X    INCLUDE    "libraries/arpbase.i"
  1203. X
  1204. XExecBase    EQU    4
  1205. X
  1206. X    xref    LinkerDB,_BSSBAS,_BSSLEN
  1207. X    xref    run,cmdline,cmdlen
  1208. X
  1209. X    csect    _STARTUP,0,0,0,4
  1210. X
  1211. Xstart    RESIDENT    2000
  1212. X    lea    LinkerDB,a4
  1213. X    tst.l    d0
  1214. X    beq.s    nocmd
  1215. X    move.l    d0,cmdlen
  1216. X    lea    cmdline,a1
  1217. X    bra.s    cpy1
  1218. Xcpy_cmd    move.b    (a0)+,(a1)+
  1219. Xcpy1    dbf    d0,cpy_cmd
  1220. X    bra.s    cont
  1221. X
  1222. Xnocmd    move.w    $1000,cmdline
  1223. X    moveq.l    #1,d0
  1224. X    move.l    d0,cmdlen
  1225. X
  1226. Xcont    lea    _BSSBAS,a3
  1227. X    moveq.l    #0,d1
  1228. X    move.l    #_BSSLEN,d0
  1229. X    bra.s    clr_lp
  1230. Xclr_bss    move.l    d1,(a3)+
  1231. Xclr_lp    dbf    d0,clr_bss
  1232. X
  1233. X    move.l    ExecBase.w,a6
  1234. X    lea    Arp,a1
  1235. X    moveq.l    #ArpVersion,d0
  1236. X    Call    OpenLibrary
  1237. X    move.l    d0,ArpBase(a4)
  1238. X    beq    noarp
  1239. X    move.l    d0,a0
  1240. X    move.l    ab_IntuiBase(a0),IntuitionBase(a4)
  1241. X    move.l    ab_DosBase(a0),d0
  1242. X    move.l    d0,DOSBase(a4)
  1243. X
  1244. X    move.l    ThisTask(a6),a3
  1245. X    move.l    pr_CurrentDir(a3),d1
  1246. X    move.l    d0,a6
  1247. X    Call    DupLock
  1248. X    move.l    d0,curdir(a4)
  1249. X
  1250. X    lea    pcb,a2
  1251. X    move.l    #2000,pcb_StackSize(a2)
  1252. X    move.b    LN_PRI(a3),pcb_Pri(a2)
  1253. X    move.b    #PRF_CLOSESPLAT,pcb_Control(a2)
  1254. X
  1255. X    move.l    #CON,d1
  1256. X    move.l    #MODE_OLDFILE,d2
  1257. X    move.l    DOSBase(a4),a6
  1258. X    Call    Open
  1259. X    move.l    d0,pcb_Output(a2)
  1260. X    move.l    d0,pcb_Input(a2)
  1261. X
  1262. X    lea    start-4(pc),a3
  1263. X    move.l    (a3),pcb_LoadedCode(a2)
  1264. X    move.l    (a3),seglist(a4)
  1265. X    move.l    ExecBase.w,a6
  1266. X    FORBID
  1267. X    suba.l    a1,a1
  1268. X    lea    name(pc),a0
  1269. X    move.l    ArpBase(a4),a6
  1270. X    Call    ASyncRun
  1271. X
  1272. X    lea    args(pc),a1
  1273. X
  1274. X    tst.l    d0
  1275. X    bmi.s    starterr
  1276. X
  1277. X    clr.l    (a3)
  1278. X    move.w    d0,4(a1)
  1279. X    lea    startmess(pc),a0
  1280. X    Call    Printf
  1281. X    bra.s    noclose
  1282. X
  1283. Xstarterr    lea    error(pc),a0
  1284. X    Call    Printf
  1285. X    move.l    curdir(a4),d1
  1286. X    Call    UnLock
  1287. X    movea.l    a6,a1
  1288. X    move.l    ExecBase.w,a6
  1289. X    Call    CloseLibrary
  1290. Xnoclose    move.l    ExecBase.w,a6
  1291. X;    Call    Permit
  1292. X
  1293. Xnoarp    rts
  1294. X
  1295. Xargs    dc.l    name
  1296. Xnum    dc.w    0
  1297. X
  1298. Xpcb    ds.b    pcb_SIZEOF
  1299. Xname    dc.b    "AmiCron",0
  1300. XCON    dc.b    "NIL:",0
  1301. X
  1302. XArp    dc.b    "arp.library",0
  1303. Xerror    dc.b    "Could not create %s-process!",10,0
  1304. Xstartmess    dc.b    "%s started at background shell %d",10,0
  1305. X
  1306. X    csect    __MERGED,1,0,0,4
  1307. X
  1308. X    xdef    IntuitionBase,ArpBase,DOSBase,curdir,seglist
  1309. X
  1310. Xseglist    dc.l    0
  1311. Xcurdir    dc.l    0
  1312. XArpBase    dc.l    0
  1313. XDOSBase    dc.l    0
  1314. XIntuitionBase
  1315. X    dc.l    0
  1316. X    END
  1317. END_OF_FILE
  1318. if test 2032 -ne `wc -c <'start.a'`; then
  1319.     echo shar: \"'start.a'\" unpacked with wrong size!
  1320. fi
  1321. # end of 'start.a'
  1322. fi
  1323. echo shar: End of archive 1 \(of 1\).
  1324. cp /dev/null ark1isdone
  1325. MISSING=""
  1326. for I in 1 ; do
  1327.     if test ! -f ark${I}isdone ; then
  1328.     MISSING="${MISSING} ${I}"
  1329.     fi
  1330. done
  1331. if test "${MISSING}" = "" ; then
  1332.     echo You have the archive.
  1333.     rm -f ark[1-9]isdone
  1334. else
  1335.     echo You still need to unpack the following archives:
  1336.     echo "        " ${MISSING}
  1337. fi
  1338. ##  End of shell archive.
  1339. exit 0
  1340. -- 
  1341. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  1342. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  1343. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  1344.